package com.zenithmind.version.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.zenithmind.version.pojo.domain.Commit;
import com.zenithmind.version.pojo.dto.CommitCreateDTO;
import com.zenithmind.version.pojo.query.CommitQueryDTO;
import com.zenithmind.version.pojo.vo.CommitVO;

import java.util.List;

/**
 * 提交服务接口
 * 
 * @author ZenithMind Team
 * @since 2025-01-09
 */
public interface CommitService extends IService<Commit> {

    /**
     * 创建提交
     * 
     * @param createDTO 创建信息
     * @return 提交信息
     */
    CommitVO createCommit(CommitCreateDTO createDTO);

    /**
     * 分页查询提交
     * 
     * @param queryDTO 查询条件
     * @return 分页结果
     */
    IPage<CommitVO> getCommitPage(CommitQueryDTO queryDTO);

    /**
     * 获取提交详情
     * 
     * @param id 提交ID
     * @return 提交详情
     */
    CommitVO getCommitDetail(String id);

    /**
     * 根据哈希获取提交
     * 
     * @param repositoryId 仓库ID
     * @param commitHash 提交哈希
     * @return 提交信息
     */
    CommitVO getCommitByHash(String repositoryId, String commitHash);

    /**
     * 获取仓库提交历史
     * 
     * @param repositoryId 仓库ID
     * @param branchName 分支名称
     * @param limit 限制数量
     * @return 提交历史
     */
    List<CommitVO> getRepositoryCommits(String repositoryId, String branchName, Integer limit);

    /**
     * 获取分支提交历史
     * 
     * @param repositoryId 仓库ID
     * @param branchName 分支名称
     * @param limit 限制数量
     * @return 提交历史
     */
    List<CommitVO> getBranchCommits(String repositoryId, String branchName, Integer limit);

    /**
     * 获取用户提交历史
     * 
     * @param authorId 作者ID
     * @param repositoryId 仓库ID
     * @param limit 限制数量
     * @return 提交历史
     */
    List<CommitVO> getUserCommits(String authorId, String repositoryId, Integer limit);

    /**
     * 获取提交的文件变更
     * 
     * @param commitId 提交ID
     * @return 文件变更列表
     */
    List<Object> getCommitChanges(String commitId);

    /**
     * 获取提交的父提交
     * 
     * @param commitId 提交ID
     * @return 父提交列表
     */
    List<CommitVO> getParentCommits(String commitId);

    /**
     * 获取提交的子提交
     * 
     * @param commitId 提交ID
     * @return 子提交列表
     */
    List<CommitVO> getChildCommits(String commitId);

    /**
     * 比较两个提交的差异
     * 
     * @param repositoryId 仓库ID
     * @param fromCommit 源提交
     * @param toCommit 目标提交
     * @return 差异信息
     */
    Object compareCommits(String repositoryId, String fromCommit, String toCommit);

    /**
     * 获取两个提交之间的提交列表
     * 
     * @param repositoryId 仓库ID
     * @param fromCommit 源提交
     * @param toCommit 目标提交
     * @return 提交列表
     */
    List<CommitVO> getCommitsBetween(String repositoryId, String fromCommit, String toCommit);

    /**
     * 搜索提交
     * 
     * @param repositoryId 仓库ID
     * @param keyword 关键词
     * @param branchName 分支名称
     * @param authorId 作者ID
     * @param limit 限制数量
     * @return 提交列表
     */
    List<CommitVO> searchCommits(String repositoryId, String keyword, String branchName, 
                                String authorId, Integer limit);

    /**
     * 获取提交统计信息
     * 
     * @param repositoryId 仓库ID
     * @param branchName 分支名称
     * @return 统计信息
     */
    Object getCommitStatistics(String repositoryId, String branchName);

    /**
     * 获取用户提交统计
     * 
     * @param authorId 作者ID
     * @param repositoryId 仓库ID
     * @return 统计信息
     */
    Object getUserCommitStatistics(String authorId, String repositoryId);

    /**
     * 获取提交活动统计
     * 
     * @param repositoryId 仓库ID
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 活动统计
     */
    Object getCommitActivity(String repositoryId, String startDate, String endDate);

    /**
     * 回滚提交
     * 
     * @param repositoryId 仓库ID
     * @param commitId 提交ID
     * @param branchName 分支名称
     * @param userId 用户ID
     * @return 回滚结果
     */
    CommitVO revertCommit(String repositoryId, String commitId, String branchName, String userId);

    /**
     * 挑选提交
     * 
     * @param repositoryId 仓库ID
     * @param commitId 提交ID
     * @param targetBranch 目标分支
     * @param userId 用户ID
     * @return 挑选结果
     */
    CommitVO cherryPickCommit(String repositoryId, String commitId, String targetBranch, String userId);

    /**
     * 获取提交图谱
     * 
     * @param repositoryId 仓库ID
     * @param branchName 分支名称
     * @param limit 限制数量
     * @return 提交图谱
     */
    Object getCommitGraph(String repositoryId, String branchName, Integer limit);

    /**
     * 验证提交哈希
     * 
     * @param repositoryId 仓库ID
     * @param commitHash 提交哈希
     * @return 是否有效
     */
    Boolean validateCommitHash(String repositoryId, String commitHash);

    /**
     * 获取提交签名信息
     * 
     * @param commitId 提交ID
     * @return 签名信息
     */
    Object getCommitSignature(String commitId);
}
